using System;
using System.Linq;
using FoundationLib.Ifc.Logging.Configuration;

namespace FoundationLib.Ifc.Logging 
{
	/// <summary>
	/// This abstract technical logger superclass implements the Strategy pattern and
	/// can be used to create special logging algorithms.
	/// </summary>
	public abstract class TechnicalLogger : ITechnicalLogger 
	{
		/// <summary>
		/// The logger configuration
		/// </summary>
		private LoggerConfigElement configuration;

		/// <see cref="ITechnicalLogger.Configuration"/>
		public LoggerConfigElement Configuration
		{
			get { return this.configuration; }
			set { this.configuration = value; }
		}

		/// <summary>
		/// Creates a new technical logger.
		/// </summary>
		protected TechnicalLogger()
		{
		}

		/// <see cref="ITechnicalLogger.Debug(Object)"/>
		public abstract void Debug(Object message);

		/// <see cref="ITechnicalLogger.Debug(Object, Exception)"/>
		public abstract void Debug(Object message, Exception exception);

		/// <see cref="ITechnicalLogger.DebugFormat(String, Object[])"/>
		public abstract void DebugFormat(String format, params Object[] args);

		/// <see cref="ITechnicalLogger.Error(Object)"/>
		public abstract void Error(Object message);

		/// <see cref="ITechnicalLogger.Error(Object, Exception)"/>
		public abstract void Error(Object message, Exception exception);

		/// <see cref="ITechnicalLogger.ErrorFormat(String, Object[])"/>
		public abstract void ErrorFormat(String format, params Object[] args);

		/// <see cref="ITechnicalLogger.Fatal(Object)"/>
		public abstract void Fatal(Object message);

		/// <see cref="ITechnicalLogger.Fatal(Object, Exception)"/>
		public abstract void Fatal(Object message, Exception exception);

		/// <see cref="ITechnicalLogger.FatalFormat(String, Object[])"/>
		public abstract void FatalFormat(String format, params Object[] args);

		/// <see cref="ITechnicalLogger.Info(Object)"/>
		public abstract void Info(Object message);

		/// <see cref="ITechnicalLogger.Info(Object, Exception)"/>
		public abstract void Info(Object message, Exception exception);

		/// <see cref="ITechnicalLogger.InfoFormat(String, Object[])"/>
		public abstract void InfoFormat(String format, params Object[] args);

		/// <see cref="ITechnicalLogger.Warn(Object)"/>
		public abstract void Warn(Object message);

		/// <see cref="ITechnicalLogger.Warn(Object, Exception)"/>
		public abstract void Warn(Object message, Exception exception);

		/// <see cref="ITechnicalLogger.WarnFormat(String, Object[])"/>
		public abstract void WarnFormat(String format, params Object[] args);

	}

}